#ifndef RUNTIMEFILESYSTEMWATCHER_H
#define RUNTIMEFILESYSTEMWATCHER_H

#include <QObject>
#include <QString>
#include <QStandardPaths>
#include <QDir>
#include <QThread>
#include <QMutex>
#include <QHash>
#include <QRegularExpression>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QHttpMultiPart>
#include <QHttpPart>
#include <QFile>
#include <QFileInfo>
#include <uv.h>

class DatabaseManager;
class BackendService;
class WebSocketServer;

// 前向声明用于存储监听器信息
struct RuntimeWatcherInfo;

class RuntimeFileSystemWatcher : public QObject
{
    Q_OBJECT

public:
    explicit RuntimeFileSystemWatcher(QObject *parent = nullptr);
    ~RuntimeFileSystemWatcher();

    // 开始监听 runtime 目录
    void startWatching();

    // 停止监听
    void stopWatching();

    // 获取监听的 runtime 目录路径
    QString getRuntimeDirectory() const;

    // 检查 runtime 目录是否存在
    bool isRuntimeDirectoryExists() const;

    // 设置数据库管理器
    void setDatabaseManager(DatabaseManager *dbManager);
    
    // 设置 BackendService
    void setBackendService(BackendService *backendService);
    
    // 设置 WebSocketServer
    void setWebSocketServer(WebSocketServer *webSocketServer);


signals:
    // 文件变化信号
    void filesChanged();
    
    // 文件提交完成信号
    void fileCommitCompleted(int resultCode, const QString &message);

private slots:
    // 处理文件创建或修改事件
    void handleFileCreatedOrChangedEvent(const QString &filePath);
    
    // 处理文件删除事件
    void handleFileRemovedEvent(const QString &filePath);

private:
    // libuv 相关
    uv_loop_t *m_loop;
    QThread *m_eventLoopThread;
    QMutex m_watchersMutex;
    QHash<QString, RuntimeWatcherInfo*> m_watchers; // 路径 -> 监听器信息
    
    QString m_runtimeDirectory;
    bool m_stopping;
    DatabaseManager *m_databaseManager;
    BackendService *m_backendService;
    WebSocketServer *m_webSocketServer;
    QNetworkAccessManager *m_networkManager;

    // 构建 runtime 目录路径
    QString buildRuntimeDirectory() const;
    
    // 检查文件是否在 runtime 目录中
    bool isFileInRuntimeDirectory(const QString &filePath) const;
    
    // libuv 相关方法
    void startEventLoop();
    void stopEventLoop();
    bool addWatcher(const QString &path, bool isDirectory);
    void removeWatcher(const QString &path);
    void removeAllWatchers();
    
    // libuv 回调函数（静态）
    static void onFsEvent(uv_fs_event_t *handle, const char *filename, int events, int status);
    
    // 事件循环线程入口
    void runEventLoop();
    
    // 处理文件上传响应
    void handleUploadResponse(QNetworkReply *reply);
    
    // 提交文件到指定URL
    void commitFileToUrl(const QString &commitUrl, const QString &localFilePath, const QString &accessToken = "");
};

#endif // RUNTIMEFILESYSTEMWATCHER_H

